【X68000(Z)アセンブラ講座 第013回 TEXTグラフィックス画面A】 2025/03/20   こんにちは!! 今回もTEXTグラフィックスの使い方を書いてみます。 今回はTEXT画面の任意の座標にドットを打つプログラムの一例です。 内容的には前回の応用みたいなものです。 破線の内側を'TextCG_2.s'と言うファイル名で保存して下さい。 ------------------------------------------------------------------------------------------------   ******************************************************************************** * * アプリ名 : TextCG_2.x * * TextCG表示のサンプル2 * * Ver1.00 * ******************************************************************************** * スプライトパレット0から15のうちパレット0はテキストパレットと共用。 * BGのパレットはスプライトと共用。 include A:\XC\INCLUDE\DOSCALL.MAC * OSコール用マクロの読み込み include A:\XC\INCLUDE\IOCSCALL.MAC * IOCS(BIOS)コール用マクロの読み込み * システム領域のアドレス cg_palette equ $E82000 * CG用パレットデータの先頭アドレス cg_buffer equ $C00000 * CG-VRAMの先頭アドレス cg_scroll_x equ $E80018 * CGスクロール X cg_scroll_y equ $E8001a * CGスクロール Y sp_palette equ $E82200 * スプライト用パレットデータの先頭アドレス sp_controll equ $EB0000 * スプライトスクロールレジスターの先頭アドレス sp_pattern equ $EB8000 * スプライトパターンデータの先頭アドレス pcg_area equ $EB8000 * SPRITEとBGのパターンデータの先頭アドレス bg_dataarea0 equ $EBC000 * BG画像0の先頭アドレス bg_dataarea1 equ $EBE000 * BG画像1の先頭アドレス bg_scroll_x0 equ $EB0800 * BG0のスクロールX座標 bg_scroll_y0 equ $EB0802 * BG1のスクロールY座標 bg_scroll_x1 equ $EB0804 * BG0のスクロールX座標 bg_scroll_y1 equ $EB0806 * BG1のスクロールY座標 text0 equ $E00000 * テキストVram プレーン0 text1 equ $E20000 * テキストVram プレーン1 text2 equ $E40000 * テキストVram プレーン2 text3 equ $E60000 * テキストVram プレーン3 vsync equ $E88001 * %00010000でV-Syncチェックする pad1 equ $E9A001 * ゲームパッド1 pad2 equ $E9A003 * ゲームパッド2 .cpu 68000 * CPUのタイプ .data * '.data'以降のデータはデータセクションに配置される sppal00: * GGGGG RRRRR BBBBB A * TEXT兼Spriteパレット dc.w %00000_00000_00000_0 dc.w %00000_00000_11111_0 dc.w %11111_00000_00000_0 dc.w %00000_11111_00000_0 dc.w %11111_00000_11111_0 dc.w %00000_11111_11111_0 dc.w %11111_11111_00000_0 dc.w %11111_11111_11111_0 dc.w %00111_00111_00111_0 dc.w %00000_00000_01111_0 dc.w %01111_00000_00000_0 dc.w %00000_01111_00000_0 dc.w %01111_00000_01111_0 dc.w %00000_01111_01111_0 dc.w %01111_01111_00000_0 dc.w %01111_01111_01111_0 .bss * '.bss'以降データバッファ .text * '.text'以降のプログラムはテキストセクションに配置される start: * スタートアドレス * カーソルをオフにする moveq.l #_OS_CUROF,d0 trap #15 * ランダム関数の初期化 move.l #23456,d0 * d0.lにランダムのシードを代入する dc.w $FE0D * ランダムのシードを設定する * ユーザーモードからスーパーバイザーモードに移行する moveq.l #_B_SUPER,d0 * d0にIOCS(BIOS)機能番号を代入 move.l #0,d1 * 数値0をd1に代入 movea.l d1,a1 * d1をa1にコピー trap #15 * IOCSコール実行 * 画面モードの設定 moveq.l #_CRTMOD,d0 * 画面モードの設定 move.w #10,d1 * 画面モードの番号 : 16 = 768x512x4bit / 10 = 256x256x8bit trap #15 * 画面をクリアして表示をオンにする moveq.l #_G_CLR_ON,d0 * 画面をクリアして表示をオンにする trap #15 * スプライト初期化 moveq.l #_SP_INIT,d0 trap #15 * スプライト表示をオンにする moveq.l #_SP_ON,d0 trap #15 bsr set_palette * スプライトパレット設定ルーチンの呼び出し bsr text_clear * TEXT-VRAMのクリアー loop: * メインループ開始 * V-Syncビットを監視してメインループを60fpsで動作させるタイミングを取る movea.l #vsync,a0 vsync_1: move.b (a0),d0 and.b #$10,d0 tst.b d0 beq vsync_1 vsync_2: move.b (a0),d0 and.b #$10,d0 tst.b d0 bne vsync_2 * テキスト画面に様々な色のドットを打つ move.w #128,d0 * d0にX座標を代入 move.w #128,d1 * d1にY座標を代入 moveq #1,d2 * d2に色番号(4bitカラー)を代入 bsr text_pset * text_psetを呼び出す move.w #130,d0 move.w #128,d1 moveq #2,d2 bsr text_pset move.w #132,d0 move.w #128,d1 moveq #3,d2 bsr text_pset move.w #134,d0 move.w #128,d1 moveq #4,d2 bsr text_pset move.w #136,d0 move.w #128,d1 moveq #5,d2 bsr text_pset move.w #138,d0 move.w #128,d1 moveq #6,d2 bsr text_pset move.w #140,d0 move.w #128,d1 moveq #7,d2 bsr text_pset move.w #142,d0 move.w #128,d1 moveq #8,d2 bsr text_pset move.w #144,d0 move.w #128,d1 moveq #9,d2 bsr text_pset move.w #146,d0 move.w #128,d1 moveq #10,d2 bsr text_pset move.w #148,d0 move.w #128,d1 moveq #11,d2 bsr text_pset move.w #150,d0 move.w #128,d1 moveq #12,d2 bsr text_pset move.w #152,d0 move.w #128,d1 moveq #13,d2 bsr text_pset move.w #154,d0 move.w #128,d1 moveq #14,d2 bsr text_pset move.w #156,d0 move.w #128,d1 moveq #15,d2 bsr text_pset * [ESC]キーが押されたら終了処理'end:'にジャンプする moveq.l #_BITSNS,d0 moveq.l #0,d1 trap #15 and.b #%00000010,d0 tst.b d0 bne end bra loop * メインループの最初にジャンプする end: bsr text_clear moveq.l #_CRTMOD,d0 move.w #16,d1 trap #15 * カーソルをオンにする moveq.l #_OS_CURON,d0 trap #15 * スーパーバイザーモードからユーザーモードに戻る moveq.l #_B_SUPER,d0 move.l SP,a1 trap #15 * アプリ終了 dc.w _EXIT * OSコール実行 : _EXIT = プログラムの終了 * RGBQUAD { Blue8, Green8, Red8, Reserved8 } = %RRRRRRRR_GGGGGGGG_BBBBBBBB_AAAAAAAA * palette { Green5, Red5, Blue5, Alpha1 } = %GGGGG_RRRRR_BBBBB_A . * Set Text(Sprite) Palette set_palette: movea.l #sp_palette,a0 * スプライト用パレットレジスターアドレス lea sppal00,a1 * パレットデータバッファアドレス moveq.l #0,d7 set_palette_1: move.w (a1)+,(a0)+ addq.w #1,d7 * 色番号を次の番号に更新する cmp.w #16,d7 * 現在の色番号と16を比較する blt set_palette_1 * 現在の色番号が16未満ならアドレスset_palette_1に飛ぶ rts * 呼出元に戻る * Clear TEXT-VRAM( 128KB * 4 ) text_clear: movea.l #text0,a0 moveq.l #0,d0 move.l #131072,d7 text_clear_1: move.l d0,(a0)+ subq.l #1,d7 bne text_clear_1 rts * テキスト画面の任意の座標にドットを打つ text_pset: * in d0.w = X(0 - 1023) * in d1.w = Y(0 - 1023) * in d2.w = color(4bit) movem.l d0-d5/a0,-(sp) ext.l d1 * ワードデータをロングデータに拡張 lsl.l #7,d1 * 左に7ビットシフトすると128倍になる ext.l d0 move.l d0,d5 and.l #%0000_0111,d5 lsr.l #3,d0 * 右に3ビットシフトすると8で割った事になる add.l d1,d0 move.w d2,d3 andi.w #%0000_0001,d3 beq text_pset_1 movea.l #text0,a0 adda.l d0,a0 move.b #%10000000,d4 lsr.b d5,d4 or.b d4,(a0) text_pset_1: move.w d2,d3 andi.w #%0000_0010,d3 beq text_pset_2 movea.l #text1,a0 adda.l d0,a0 move.b #%10000000,d4 lsr.b d5,d4 or.b d4,(a0) text_pset_2: move.w d2,d3 andi.w #%0000_0100,d3 beq text_pset_3 movea.l #text2,a0 adda.l d0,a0 move.b #%10000000,d4 lsr.b d5,d4 or.b d4,(a0) text_pset_3: move.w d2,d3 andi.w #%0000_1000,d3 beq text_pset_4 movea.l #text3,a0 adda.l d0,a0 move.b #%10000000,d4 lsr.b d5,d4 or.b d4,(a0) text_pset_4: movem.l (sp)+,d0-d5/a0 rts ------------------------------------------------------------------------------------------------ コマンドプロンプトから、 A>as TextCG_2.s [Enter] A>lk TextCG_2.o [Enter] A>TextCG_2.x [Enter] のように入力すると 複数の色の付いたピクセルが画面の中央辺りに表示されます。 終了は[ESC]キーです。 サンプルプログラム内のドットを打つ座標を変更したり 打つドットを増やしたり パレットデータの色データを変更したりして サンプルプログラムを楽しんでもらえると嬉しいです。 それでは皆さん、お疲れ様でした!!